反转链表： https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca?
class Solution {
  public:
    ListNode* ReverseList(ListNode* pHead) {

        if (pHead == nullptr || pHead->next == nullptr) 
        {
            return pHead;

        }
        //不带头结点，至少有2个节点
        ListNode* first = pHead; //指向第一个节点
        ListNode* second = first->next; //指向第二个节点
        ListNode* third = second->next; //指向第三个节点，可能为nullptr
        while (third) 
        { 
            //因为third在最前面，所以他一定先到nullptr，只要检测它是否合法即可
            //翻转
            second->next = first;
            //指针整体后移
            first = second;
            second = third;
            third = third->next;
        }
        second->next = first; //当传入的链表只有两个节点 or 上述翻转结束时，最后一个节点并未翻转
        pHead->next = nullptr; //曾经的第一个节点，next并不是nullptr，设置一下
        pHead = second; //头指针指向最后一个节点
        return pHead;
    }
};